سیگنال ژنراتور با روش DDS

در این نوشتار شما با روش ایجاد سیگنال با روش ( Direct Digital Synthesis ) DDS یا ترکیب مستقیم دیجیتالی آشنا میشوید.
با این روش شما میتوانید هر گونه سیگنال آنالوگ (بشرط سیکلی با متواتر بودن) را با دقت زیادی تولید کنید.
شرکت Analog Devices برای اینکار مدارات فشرده ای تولید میکند که قادر به تولید فرکانس هایی از چند مگاهرتز تا چندین صد مگاهرتز هستند, علاوه بر مزیتهای دیگری مانند مولتی فرکانس بودن, مدولاسیون فرکانس و غیره.
اجزای اصلی این روش :
- یک جمع کننده ( phase accumulator )
- یک جدول متشکل از اطلاعات دامنه سیگنال مورد نظر ( lookup table )
- یک تبدیل کننده دیجیتال به آنالوگ ( DAC )
- فیلتر پایین گذر و منبع اوسیلاتور است.

DDS Model این شکل چگونگی ارتباط این اجزا را نشان میدهد:

تعداد بیت در شکل فقط مثال است و در سیستم های مختلف متفاوت است.( بین 24 تا 48 بیت)
طرز کار آن بدینصورت است که در هر پالس سیستم, phase accumulator دو عدد را با هم جمع میکند که یکی مقدار تغییرات فاز است و دیگری حاصل جمع.
در زمان t=0 مقدار phase accumulator صفر است.
حاصل جمع phase accumulator برای تعیین آدرس جدول lookup بکار میرود و عددی که در این مکان از آدرس جدول قرار دارد بعنوان دامنه سیگنال به DAC فرستاده میشود.
دلیل اینکه چرا فقط از تعداد کمی از پهنای بیت بعنوان آدرس جدول lookup استفاده میشود این است که با استفاده از تمامی بیتها مقدار حافظه لازم برای جدول خیلی زیاد میشود, مثلا در اینجا بیشتر از 2,4 گیگا آدرس میشود و دوم اینکه تبدیل کننده DAC بعد از این جدول یک حداقل خطای دقتی دارد که معمولا یکچهارم کمترین بیت است, به همین دلیل شمارنده آدرس جدول کافی است که 2 بیت بیشتر از دقت DAC داشته باشد تا در محدوده خطای DAC بمانیم.
مثلا در شکل بالا دیجیتال به آنالوگ 10 بیتی است و تعداد بیتهای آدرس برای جدول 12 بیت.
بعد از DAC یک فیلتر پایین گذر فرکانسهای اضافی تولید شده را تضعیف میکند و سیگنال آنالوگ را در اختیار میگذارد.

DDS Phase دراین شکل بعنوان مثال چگونگی رابطه دامنه و فاز را در یک سیگنال سینوسی نشان میدهد:
همانطور که میدانیم دامنه این موج ( a(t) = sin(ωt) ) خطی نیست, یعنی اندازه تغییرات دامنه در فواصل مساوی از زمان ثابت نیست ولی تغییرات فاز آن ثابت است.

در روش DDS از این خطی بودن فاز استفاده میشود, بدین صورت که یک سیکل کامل را با عددی ( مثلا 32 بیت ) مشخص میکنند و مقادیر دامنه مربوطه را در جدولی ( lookup table ) قرار میدهند.
اگر ما با یک فاصله معینی, Δt ,این عدد ( 32 بیت ) را طی کنیم, به ازای هر قدم Δt در جدول مقدار دامنه آنرا میتوانیم بخوانیم.
با توجه به اینکه سرعت زاویه ( ω ) و فرکانس اینطور تعریف شده اند, ω = 2.Π.f omega
و این سرعت زاویه همان تغییرات فاز در واحد زمان است, omega1
بنابراین : omega2
حال اگر اندازه تعداد زاویه ها یا فاز در یک سیکل را که برابر 2π یا 360 درجه است را مساوی عدد مشخصی ( اینجا 2 بتوان 32 ) قرار دهیم dt
و واحد زمان را مساوی پریود پالس سیستم بدانیم dt
با این مقادیر میتوانیم تغییرات فاز dPhase را بدست بیاوریم. fValue
حداکثر فرکانسی که با این روش میتوان تولید کرد طبق قانون nyquist theorem نصف فرکانس سیستم است.
اگر فرض کنیم که پالس سیستم ( CLK ) مثلا 1 مگاهرتز باشد:
حداکثر فرکانس 500KHz خواهد بود.
حداقل آن وقتی است که مقدار N=1 باشد, fout = N.CLK/2^32 و اینجا تقریبا برابر است با 0.2 میلی هرتز.
با تولید سیگنال از طریق آنالوگ هیچگاه, با بسختی بتوان به این دقت دست یافت.

بالا پایین

میکروکنترلر و DDS

در میکروکنترلر دو اجزای اصلی سیستم, یکی جمع کننده و دیگری حافظه موجود است و میتوان از آن توسط نرم افزار استفاده کرد.
در این مثال میخواهیم از یک PIC18F2455/2550/4455/4550 برای درست کردن یک ژنراتور برای امواج سینوسی, مثلثی, دندان اره ای و مربعی استفاده کنیم.
برای این 4 نوع سیگنال به 1024 بایت از حافظه نیاز داریم.(برای هرکدام به 256 نمونه یا Sample احتیاج است)
مقادیر دامنه موج ها یا lookup table را در حافظه داخلی یا فلاش قرار میدهیم, زیرا با اینکه این نوع کنترلر دارای 256 بایت EEPROM نیز هست ولی چون خواندن یک بایت از EEPROM داخلی زمان زیادتری نسبت به خواندن آن از درون حافظه فلاش میبرد و دوم اینکه اگر بخواهیم بیشتر از یک نوع موج را تولید کنیم اندازه EEPROM کافی نیست.
در این نوع میکروکنترلر میتوانیم توسط دستورات TBLPTR و TABLAT , با 4 سیکل از درون حافطه فلاش بخوانیم.
برای ایجاد DAC از مدار R2R استفاده میکنیم زیرا بسیار ساده است و فقط از یک نوع یا دو نوع مقاومت استفاده میشود.
برای فیلتر, میتوان یا از نوع پاسیو ( Passive ,توسط خازن و بوبین ) و یا چون فرکانس مدار زیاد بالا نیست از نوع اکتیو ( Aktive ,توسط تقویت کنندهای عملیاتی ) استفاده کرد.

شرح قسمت نرم افزار مدار :

برای پهنای Bus ما اینجا 24 بیت در نظر میگیریم, بنابراین برای phase accumulator از 3 بایت ( 24 بیت ) استفاده میکنیم و این 3 بایت را بترتیب PhAcc2...PhAcc0 نامگذاری میکنیم.
برای مقدار تغییرات فاز نیز به 3 بایت احتیاج داریم که آنان را dPhase2...dPhase0 مینامیم.
اطلاعات مربوط به دامنه سیگنال سینوسی را میتوانیم توسط ماشین حساب یا برنامه Exel محاسبه کنیم.
چون در حالت معمولی مقادیر موج سینوس در محدوده بین 1 و 1- است, باید با یک فاکتور 256 ضرب و یک Offset که باید 128 باشد را به آن اضافه کنیم تا مقادیر آن بین 0 و 256 قرار بگیرد.
برای این باید یک سیکل ( 360 درجه ) را به 256 قسمت تقسیم کرده و دامنه سینوس را در ازای هر یک از این قسمت ها( 1,40625 درجه ) تعیین کرد.
برای راحتی با توجه به اینکه موج سینوسی متقارن است فقط لازم است که مقادیر بین 0 تا 90 درجه ( 64 عدد ) را مشخص کنیم.
برای آدرس lookup table از 8 بیت بالای Bus استفاده میکنیم زیرا کنترلر 8 بیتی است و دستورات آن برای یک بایت طراحی شده و میتوان با دستورات کمتری عملیات 8 بیتی را انجام داد.( برای عملیات مثلا 10 بیتی, زمان زیادتری مصرف میشود )
بعنوان مثال کد زیر 3 بایت را با هم جمع میکند, آدرس lookup table را مشخص و مقدار دامنه را در پورت A قرار میدهد.
تعداد n-Cyc که در کامنت بعد از هر دستور نوشته شده نشاندهنده تعداد سیکل هایی است که کنترلر برای اجرای آن دستور نیاز دارد.
مجموعه همه این سیکلها پریود پالس سیستم DDS ما یا Takt آنرا تشکیل میدهد.
از بایت Event برای خروج از loop استفاده میشود, زیرا باید به طریقی مقادیر فرکانس مورد نظر خروجی از طرف استفاده کننده داده شود. اینکار را میتوان در اینترفیسی مانند USB/UART/SPI یا از طریق صفحه کلید انجام داد.
اینجا از پورت A برای ورودی DAC, که 8 بیت است استفاده شده.
در برنامه قبل از شروع این زنجیره ( loop ) بستگی به اینکه چه نوع موجی بخواهیم تولید کنیم از TBLPTRH برای مشخص کردن آدرس آن در حافطه استفاده می کنیم.
نکته دیگر اینکه کوچکترین بایت آدرس جدول در حافظه باید با صفر شروع شود, مثلا آدرس 0x0400 یا 0x5C00
   
;#################################################
DDS_Loop:
	btfsc   Event,0            ; 2-Cyc
	bra     DDS_Loop_End       ; loop برای خارج شدن از 
 	movf	dPhase0,W          ; 1-Cyc
 	addwf	PhAccu0,f          ; 1-Cyc
 	movf	dPhase1,W          ; 1-Cyc
 	addwfc	PhAccu1,f          ; 1-Cyc
 	movf	dPhase2,W          ; 1-Cyc
 	addwfc  PhAccu2,f          ; 1-Cyc
	movf	dPhase3,W          ; 1-Cyc
 	addwfc	PhAccu3,f          ; 1-Cyc
	MOVFF	PhAccu3,TBLPTRL    ; 2-Cyc
	TBLRD*                     ; 2-Cyc
	MOVFF	TABLAT,PORTB       ; 2-Cyc
	bra     DDS_Loop           ; 2-Cyc
DDS_Loop_End:
;#################################################
  
  
همانطور که دیده میشود برای اجرای تمام دستورات DDS_loop به 16 سیکل داخلی نیاز است, با یک اوسیلاتور 16 مگاهرتز, زمان پریود سیکل DDS برابر با :
16 * 250nS = 4µS است که معادل فرکانس 250 KHz میباشد.
بنابراین حداکثر سیگنالی را که میتوان با این کد تولید کرد 125 KHz میباشد.
ما این سیگنال را میتوانیم با دقت 14,9 mHz تولید کنیم!

مثلا اگر بخواهیم یک سیگنال با فرکانس 1000 هرتز را تولید کنیم باید مقدار dPhase را بدینصورت محاسبه کنیم:

dPhase = (Fout/Fclk)*2^24
dPhase =(1000/250000)* 2^24
dPhase = 67108,864
dPhase = 0x10624 hex

این عدد را باید در واریابلهای dPhase3...dPhase0 بارگیری کنیم
پس dPhase0 = 0x24 و dPhase1 = 0x06 و dPhase2 = 0x01 خواهد بود.
و DDS_loop را اجرا کنیم.
به دلیل اینکه مقدار بعد از ممیز را در عدد محاسبه شده از دست میدهیم, فرکانس تولید شده دارای مقداری خطا خواهد شد. این خطا با عدد 67108 برابر است با

Fout = (dPhase*Fclk)/2^24
Fout =(68107*250000)/ 2^24
Fout = 999,987 Hz

و اگر مقدار بعد از ممیز را بطرف بالا کامل کنیم و عدد 67108+1=67109 را استفاده کنیم فرکانس برابر :

Fout = 1000,002 Hz

خواهد بود. مقدار این خطا به عدد بعد از ممیز بستگی دارد. در هر صورت مجموع مقدار هر دو خطا حداکثر برابر با دقت سیستم ( اینجا 14.9 میلی هرتز ) خواهد بود.(انتخاب با شماست!)

تبدیل کننده دیجیتال به آنالوگ R2R :

شکل کلی مدار دیجیتال به آنالوگ بدینصورت است:
R2R

برای اینکه از پورت خروجی کنترلر جریان زیادی نکشیم بهتر است که از مقاومتی بزرگتر از 10 کیلو اهم استفاده کنیم.
مقاومت خرودی آن همیشه برابر R است و مقدار بایت ورودی دیجیتال در آن بی تاثیر است.
معادله ولتاژ خروجی آن Vout = Vref * data/2^N است.
N تعداد بیت ها و data مقدار بایت دیجیتال و Vref ولتاژ مبنا یا رفرنس آن است.
چون تغذیه مدار اینجا 5 ولت است, ولتاژ مبنا 5 ولت میباشد, مقدار N اینجا 8 بیت است.
این معادله نشان میدهد که حداکثر ولتاژ خروجی به اندازه یک قدم ( Resolution ) کمتر از ولتاژ رفرنس میباشد.

DAC Last باید توجه کنید که ولتاژ خروجی داده شده در معادله, بدون مقاومت بار است و بعنوان مثال اگر مقاومتی مانند R را در خروجی DAC به زمین وصل کنیم, ولتاژ خروجی نصف خواهد شد. زیرا همانطور که گفته شد مقاومت داخلی آن برابر R است.
این شکل رابطه مقاومت بار و مقاومت داخلی DAC نشان میدهد.

Treiber_Input برای اینکه این تلفات ولتاژ را نداشته باشیم, میتوان ار تبدیل کننده امپدانس استفاده کرد.
این مدار اساسی آن است.
در صورت استفاده باید به این نکات توجه کنید.
ولتاژ خروجی این تقویت کننده ها برابر با منبع تغذیه آنان نمیشود و همیشه کمتر است, معمولا تا حدود حداقل 1,5 ولت. پس باید منبع تغذیه آنان بهمین اندازه بیشتر از حداکثر ولتاژی باشد که باید تقویت کنند.
این یعنی در مدار به دو منبع تغذیه نیاز است, یکی برای قسمت دیجتال و دیگری برای قسمت آنالوگ, که باعث بالا رفتن هزینه میشود.
اگر از نوع Rail to Rail استفاده کنید, تا حدودی این مشکل رفع میشود ولی نه کامل, زیرا این نوع هم دارای مقدار کمی تفاوت ولتاژ ( حدود 0,5 ولت ) هست ولی نه به اندازه نوع معمولی.
بطور معمول ما فقط یک منبع تغذیه 5 ولتی در مدارات دیجیتال داریم, بنابراین باید یا ولتاژ خروجی DAC را کم کنیم یا ولتاژ ورودن آنرا.
ولتاژ ورودی آن به ولتاژ میکروکنترلر وابسته است و در حالت عادی 5 ولت است. در اینجا ما امکان زیادی برای تغییر نداریم.(حداکثر 0,5 ولت) و علاوه بر اینکه ولتاژ رفرنس DAC باید در حد قابل قبولی ثابت باشد.
روشهای متفاوت دیگری نیز وجود دارد, مثلا استفاده از ولتاژ رفرنس تثبیت شده یا مدار رابط ( Bus Driver ), ولی تمام اینها هزینه مدار را بالا میبرد چون به تعداد بیشتری قطعات نیاز میباشد.
برای سادگی اینجا ولتاژ خروجی مدار را به 2,5 ولت محدود میکنیم, تا با یک منبع تغذیه 5 ولتی بتوانیم همه مدار را طراحی کنیم.
البته ناگفته نماند که ما میتوانیم توسط خود میکروکنترلر و یک پین آن که دارای موج مربعی ( PWM ) باشد نیز ولتاژی معادل 8,5 ولت ایجاد کنیم که با آن میشود تبدیل کننده امپدانس را تغذیه کرد. ( روش پمپاژ بار التریکی Charge Pumpe )

بالا پایین

فیلتر :

وظیفه این فیلتر اینست که فرکانسهای اضافه ای را که بخاطر عملیات دیجیتال اینجا تولید میشود را حذف کند.
در سیستمهای دیجیتالی که با یک Takt عمل میکنند, در طیف فرکانس, فرکانسهای متعددی تولید میشود.
این فرکانسها با تداخل Takt با فرکانس خروجی تولید میشوند.
خود Takt چون یک موج مربعی در طیف زمان است در طیف فرکانس بصورت سیگنال si=sin(x)/x ظاهر میشود.
بقیه فرکانسها با جمع و تفریق این فرکانس و مضروب آن ایجاد میشود.

این شکل فرکانسها در طیف فرکانس است. DDS Phase

در این تصویر فرض میکنیم که فرکانس خروجی ما 60 کیلوهرتز است و همینطور که دیده میشود هر چه فرکانس ما به مرز فرکانس nyquist نزدیکتر میشود, تصویر اولین فرکانس مزاحم هم به این مرز نزدیکتر میشود و این کار ما را برای فیلتر سخت تر میکند. به همین دلیل در سیستم های DDS, حداکثر فرکانس خروچی را معمولا تا 40% فرکانس Takt محدود میکنند تا بتوان با کار کمتری آنرا تصویه کرد. در اینجا چون فاصله حداکثر فرکانس خروجی ما ( 100KHz ) با تاکت ( 200KHz ) کم است این فیلتر ما باید دارای درجه بالایی باشد تا بتوان سیگنالهای اضافی را در حد قابل قبولی تضعیف کرد
ما در اینجا به یک فیلتر پایین گذر ( Lowpass ) نیاز داریم که در بهترین حالت فرکانس 100KHz را عبور دهد و فرکانسهای بالاتر را حداقل 30dB تضعیف کند.
در مبحث فیلتر ها میدانیم که آنها در یک دهه لگاریتمی ( decade: 10n ... 10n+1 ) دارای خاصیت تضعیف کنندگی برابر با 20 دسی بل (dB) هستند یا بعبارت دیگر در هر اوکتاو 6dB و این خاصیت با اضافه شدن هر درجه فیلتر با مضروب درجه بالا میرود, مثلا فیلتر درجه یک 20dB و درجه دو 40dB در یک دهه لگاریتمی تضعیف میکند.
و اینجا چون فاصله فرکانس nyquist ما با Takt یک دهم یک دهه لگاریتمی یا یک اوکتاو است پس برای تضعیفی برابر با حداقل 20dB/octave, فیلتر ما باید حداقل درجه 4 داشته باشد که در اینصورت قدرت تضعیف کنندگی آن برابر با 24dB/octave خواهد بود.
فیلتر ها از نظر الکتریکی دو نوع هستند, یا پاسیو ( Passive ) با اکتیو ( Aktive ). پاسیو یعنی آنها دارای منبع انرژی یا تغذیه نیستند و از مقاومت, خازن و بوبین استفاده میکنند و نوع اکتیو که به منبع تغذیه نیاز دارند و از تقویت کننده های عملیاتی یا ترانزیستور استفاده میکنند.
این فیلتر ها برای یک مقاومت خروجی و ورودی معینی محاسبه میشوند, در اینجا مقاومت ورودی فیلتر برابر مقاومت خروجی مدار آنالوگ به دیجیتال ما میباشد. در اینترنت برنامه های رایگانی برای محاسبه انواع مختلف فیلتر وجود دارد, برای مثال شرکت AnalogDevice برنامه خوبی برای محاسبه انواع فیلتر های اکتیو بصورت آنلاین در اختیار شما میگذارد.
این لینک آن میباشد.( Analog Device Aktive Filter design )

LTSpice Filter من در اینجا از نوع پاسیو استفاده کرده ام. و شبیه سازی آنرا توسط برنامه LTSpice اینجا میبینید.
(برای بزرگتر شدن روی عکس کلیک کنید)
این فیلتر برای مقاومت ورودی و خروجی 50 اهم طراحی شده, بنابراین باید از یک تبدیل امپدانس بعد از DAC استفاده کرد.
تغییرات تضعیف کنندگی این فیلتر در منطقه گذر ( Pass Band ) ثابت نیست و حدود 2dB تغییر میکند.
این فیلتر ایده ال نیست ولی برای این پروژه مناسب است.
قطعات استفاده شده بسیار معمولی هستند و من چون بوبین 100µH در اختیار داشتم از آن استفاده کردم ( موازی کردن دو عدد ) و خارنهای آن در دسترس هر آماتوری نیز میباشد.
( از ترکیب 10nF و 100nF )

مدار عملی :

برای آزمایش این اطلاعات من از مدار MBL استفاده کردم, چون برای چنین کارهایی طراحی شده.

Block l این شکل چگونگی ارتباط این اجزا را نشان میدهد:

نرم افزار این پروژه از کد بالا و مقدار کمی کد تشکیل شده که آنرا در اینجا میبینید:
در این کد اطلاعات برای 4 نوع موج (سینوس, مثلثی , دندان اره ای و مربعی ) موجود است.
برای تولید موج مربعی بهتر است که یا موج سینوس را توسط یک اشمیت تریگر به مربع تبدیل کنیم یا خروجی موج مربعی قبل از فیلتر باشد زیرا وجود فیلتر شکل آنرا تغییر میدهد.
این فیلتر دو موج دیگر را نیز در فرکانسهای نزدیک به مرز nyquist تا حدودی تغییر میدهد.
فرکانس خروچی مورد نظر توسط USB به مدار فرستاده میشود,

Test DDS این اسکرین شات برنامه است که توسط آن نوع موج و فرکانس آنرا توسط USB تغییر میدهیم.
گزینه فرکانس DDS برای این است که برنامه فقط به یک فرکانس برای DDS محدود نشود.
این برنامه را میتوانید از اینجا TestDDS.exe دانلود کنید.
این برنامه دستورات را بدین شکل ارسال میکند:(از چپ به راست)
[CMD] [Signal form] [1.Byte] [2.Byte] [3.Byte] [4.Byte]
تعریف این بایت ها چنین است:
CMD = 0x0B
شکل سیگنال [Signal form] در حقیقت آدرس داده ها در فلاش است و چون من آنان را از آدرس 0x05C00 به بعد قرار داده ام, از 0x5C برای سینوس شروع شده و برای هر موج بعدی 256 = 0x100
به آن اضافه میشود که بترتیب 0x5F , 0x5E , 0x5D خواهد بود.
اگر در برنامه خود آنان را در آدرس دیگری قرار میدهید و از این برنامه استفاده میکنید باید به این توجه کنید و مقدار لازم را در برنامه خود محاسبه کنید.
ارسال 4 بایت برای این است که کمی آزادی عمل در انتخاب پهنای بیت برای سیستم داشته باشیم.(24 یا 32 بیت)
اگر از 24 بیت استفاده میکنید از بایت چهارم باید صرفنظر کنید.
بایت اول, دارای کمترین ارزش عددی است.

برای تبدیل کننده امپدانس بعد از DAC و بعد از فیلتر من از تقویت کننده عملیاتی LM358 استفاده کرده ام جون در دسترس داشتم.
این گزینه ایده الی نیست, زیرا دارای پهنای باند کمی (0.7 مگاهرتز ) است و Slowrate آن نیز پایین است ( 0.3 ولت در میکروثانیه ).
تقویت کننده های عملیاتی مانند OP279 با LMV721 گزینه های بسیار مناسبتری برای اینکار میباشند.

2 OP-AMP در این شکل مدار و شبیه سازی دو نوع از OP-AMP را توسط LTSpice میبینید.
تفاوت استفاده بخوبی نمایان است.
(برای بزرگتر شدن روی عکس کلیک کنید)

را توسط Bootloader در MBL بارگیری کردم و DAC و فیلتر را هم روی یک فیبر سوراخدار لحیم کردم.
تغییر مقدار فرکانس خروجی نیز از طریق USB انجام میشود.
این فیلم کوتاه چگونگی استفاده و شکل فرکانس خروجی را نشان میدهد.
البته شما میتوانید این مدار را بصورت تنها نیز درست کنید.
برای اینکار به یک صفحه کلید( ماتریکس 4x4) و یک نشاندهنده LCD نیز نیاز دارید.
این شکل چگونگی ارتباط این اجزا را نشان میدهد:

Block 2 از این مدار میتوانید بصورت راهنما استفاده کنید.
(برای بزرگتر شدن روی عکس کلیک کنید)
LTSpice Filter


بالا پایین


این تصاویر نمونه آزمایشی و سیگنالهای تولید شده با فرکانس 1000 هرتز, 10000 هرتز و 60000 هرتز را نشان میدهند.
بغیر از موج سینوس بقیه موجها از فرکانس 20000 هرتز به بالا توسط فیلتر ساده مدار آزمایشی تفییر میکنند.
(برای بزرگتر شدن روی عکس کلیک کنید)

stern

امیدوارم که این پروژه برای شما مفید باشد. اگر سوالی یا پیشنهادی دارید از قسمت نظر شما استفاده کنید.